package zozopo.database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 数据库管理器:与数据库建立连接、断开连接、执行查询和更新操作
 * 
 * @author 林继双
 * @version 1.2
 * 
 */

public class SysDatabaseManager implements DatabaseManager{
	private static final Log logger = LogFactory.getLog(SysDatabaseManager.class);

    public SysDatabaseManager() {
    }

    /**
     * 获得一个数据库连接
     * 
     * @return Connection对象
     * 
     */
    public Connection getConnection() {

        Connection conn = null;

        try {
            Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
            conn = DriverManager.getConnection("proxool.zozopo");
        } catch (ClassNotFoundException e) {
            // 在classpath中未找到合适的驱动
            logger.error("No suitable driver found");
            logger.error(e.getMessage());
            return null;
        } catch (SQLException e) {
            // 获取连接失败
            logger.error("Get connection failed, check the proxool configuration file and web.xml");
            logger.error(e.getMessage());
            return null;
        }

        if (conn != null) {
            if (logger.isDebugEnabled()) {
                logger.debug("Connected");
            }
        }

        return conn;// 返回该Connection
    }

    /**
     * 传入执行查询的语句，返回结果集
     * 
     * @param conn
     *            Connection连接对象
     * @param sql
     *            String类型的sql语句
     * @return 结果集 ResultSet
     */
    public ResultSet executeQuery(Connection conn, String sql) {

        Statement stmt = null;// 声明Statement stmt
        ResultSet rs = null;// 声明ResultSet rs

        if (conn != null) {
            // Connection 不为null，执行查询

            // 若debug模式开启，则输出debug 信息
            if (logger.isDebugEnabled()) {
                logger.debug(sql);
            }

            try {
                stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                        ResultSet.CONCUR_READ_ONLY);// 通过Connection创建一个Statemet
                rs = stmt.executeQuery(sql);// 执行查询语句，
            } catch (SQLException sqlex) {
                logger.error("Execute query failed: [" + sql + "]");
                logger.error(sqlex.getMessage());
                return null;
            }
            return rs;
        } else {
            // Connection 为null，输出info信息，返回null
            logger.info("Connection is null, execute sql query: [" + sql
                    + "] failed");
            return null;
        }
    }

    /**
     * 传入执行数据更新的语句，返回更新结果，成功执行为真
     * 
     * @param conn
     *            Connection连接对象
     * @param sql
     *            String类型的sql语句
     * @return 执行结果，布尔型
     */
    public boolean executeUpdate(Connection conn, String sql) {

        boolean status = false;// 执行结果，默认为false

        Statement stmt = null;// 声明Statement stmt

        if (conn != null) {
            // Connection 不为null，执行更新

            // 若debug模式开启，则输出debug 信息
            if (logger.isDebugEnabled()) {
                logger.debug(sql);
            }

            try {
                stmt = conn.createStatement();// 通过Connection创建一个Statemet
                int count = stmt.executeUpdate(sql);// 执行更新数据操作，返回影响的行数

                // 根据count值,判断执行的成功或失败
                if (count > 0)
                    status = true;

            } catch (SQLException sqlex) {
                logger.error("Execute update failed: [" + sql + "]");
                logger.error(sqlex.getMessage());
            }
        } else {
            // Connection 为null，输出info信息，返回false

            logger.info("Connection is null, execute sql update: [" + sql
                    + "] failed");
        }
        return status;

    }
    
    

    /**
     * 释放从连接池取得的连接
     * 
     * @param conn
     * Connection连接对象
     */
    public void releaseConnection(Connection conn) {

        // 释放连接
        if (conn != null) {
            try {
                conn.close();
                if (logger.isDebugEnabled()) {
                    logger.debug("Connection released");
                }
            } catch (SQLException sqlex) {
                logger.error("Release connection failed");
            } finally {
                conn = null;
            }
        }
    }
}
